package DAO;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import com.mysql.jdbc.CallableStatement;
import com.mysql.jdbc.MySQLConnection;
import com.mysql.jdbc.PreparedStatement;
import com.sun.xml.internal.bind.v2.runtime.unmarshaller.XsiNilLoader.Array;
import com.sun.xml.internal.ws.org.objectweb.asm.Type;

import Model.Cid;
import Model.Paciente;
import Utils.Conexao;

public class PacienteDAO {
	public static int Insert(Paciente paciente) throws SQLException
	{		
		Connection con = Conexao.getConection();		
		String mysqlCall = "call spc_insert_paciente(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
		CallableStatement call = PacienteDAO.setObjectCallableStatement(paciente, mysqlCall, con);
		call.execute();		
		int id_paciente = Integer.parseInt(call.getString(14));		
		
		call.close();	
		con.close();		
		return id_paciente;
	}	
	
	public static void InsertDiagnosticos(List<String> listaDiagnosticos, int id_paciente) throws SQLException
	{		
		Connection con = Conexao.getConection();
		//limpa a lista de diagnostico para esse paciente
		
		String mysqlCallDelete = "call spc_delete_paciente_diagnostico(?)";
		CallableStatement callDelete =(CallableStatement) con.prepareCall(mysqlCallDelete);
		callDelete.setInt(1, id_paciente);
		callDelete.execute();		
		
		String mysqlCall = "call spc_update_paciente_diagnostico(?, ?)";
		CallableStatement call =(CallableStatement) con.prepareCall(mysqlCall);
		
		for(int i = 0; i<listaDiagnosticos.size(); i++)
		{
			call.setInt(1, id_paciente);
			call.setInt(2, Integer.parseInt(listaDiagnosticos.get(i)));
			call.execute();
		}		
		
		call.close();
		con.close();
		
		callDelete.close();		
	}
	
	
	public static ResultSet relatorioProntuario(java.sql.Date data_inicio, java.sql.Date data_fim) throws SQLException
	{
		Connection con = Conexao.getConection();		
		String mysqlCall = "call spc_relatorio_prontuario(?, ?)";
		CallableStatement call = (CallableStatement) con.prepareCall(mysqlCall);
		call.setDate(1, data_inicio);
		call.setDate(2, data_fim);
		ResultSet res = call.executeQuery();
		return res;
	}
	
	public static void Update(Paciente paciente) throws SQLException
	{		
		Connection con = Conexao.getConection();		
		String mysqlCall = "call spc_update_paciente(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";			
		CallableStatement call = PacienteDAO.setObjectCallableStatement(paciente, mysqlCall, con);		
		call.execute();		
		call.close();		
		con.close();		
	}	
	
	public static Paciente LoadObject(int idPaciente) throws SQLException
	{		
		Paciente paciente = new Paciente();
		Connection con = Conexao.getConection();		
		String mysqlCall = "call spc_select_paciente_por_id(?)";
		CallableStatement call =(CallableStatement) con.prepareCall(mysqlCall);
		call.setInt(1, idPaciente);
		
		ResultSet res = call.executeQuery();
		
		if(res.next())
			paciente = PacienteDAO.setInstance(res);		
		
		 
		call.close();	
		con.close();		
		
		return paciente;
	}	

	public static ArrayList<Paciente> GetArrayListPacientes()
	{
		Connection con = Conexao.getConection();		
		ArrayList<Paciente> arrPaciente = new ArrayList<Paciente>();
		
		try
		{
			String mysqlCall = "call spc_select_pacientes()";
			CallableStatement call =(CallableStatement) con.prepareCall(mysqlCall);
			ResultSet res = call.executeQuery();			
			
			while(res.next())
			{
				Paciente paciente =  PacienteDAO.setInstance(res);
				arrPaciente.add(paciente);
			}			
			
			call.close();
			con.close();
		}
		catch(SQLException ex)
		{
			ex.printStackTrace();
		}
		
		return arrPaciente;
	}	
	
	public static ArrayList<Paciente> GetArrayListPacientes(String termo)
	{
		Connection con = Conexao.getConection();		
		ArrayList<Paciente> arrPaciente = new ArrayList<Paciente>();
		
		try
		{
			String mysqlCall = "call spc_select_paciente_por_termo(?)";
			CallableStatement call =(CallableStatement) con.prepareCall(mysqlCall);
			call.setString(1, termo);
			ResultSet res = call.executeQuery();			
			
			while(res.next())
			{
				Paciente paciente =  PacienteDAO.setInstance(res);
				arrPaciente.add(paciente);
			}			
			
			call.close();
			con.close();
		}
		catch(SQLException ex)
		{
			ex.printStackTrace();
		}
		
		return arrPaciente;
	}
	
	public static void InativarPaciente(int id) throws SQLException
	{
		Connection con = Conexao.getConection();
		String mysqlCall = "call spc_inativar_paciente(?)";		
		CallableStatement call =(CallableStatement) con.prepareCall(mysqlCall);
		call.setInt(1, id);
		call.execute();		
		
		call.close();
		con.close();
	}
	
	public static boolean ExistePacientePorCpf(String cpf, int id_paciente)
	{
		int quantidade = 0;
		try {
			Connection con = Conexao.getConection();		
			String mysqlCall = "call spc_select_count_paciente_por_cpf(?, ?)";
			CallableStatement call = (CallableStatement) con.prepareCall(mysqlCall);
			call.setString(1, cpf);
			call.setInt(2, id_paciente);
			ResultSet res = call.executeQuery();			
			
			if(res.next())
				quantidade = res.getInt("quantidade");			
			
			call.close();
			con.close();		
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return quantidade > 0;
	}
	
	public static boolean ExistePacientePorRg(String rg, int idPaciente)
	{
		int quantidade = 0;
		try {
			Connection con = Conexao.getConection();		
			String mysqlCall = "call spc_select_count_paciente_por_rg(?, ?)";			
			CallableStatement call = (CallableStatement) con.prepareCall(mysqlCall);
			call.setString(1, rg);
			call.setInt(2, idPaciente);
			ResultSet res = call.executeQuery();
			
			if(res.next())
				quantidade = res.getInt("quantidade");			
			
			call.close();
			con.close();		
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return quantidade > 0;
	}	
	
	
	public static List<String> GetCidArrayListPorPaciente(int idPaciente)
	{
		ArrayList<String> arrCid = new ArrayList<String>(); 
		Connection con  = Conexao.getConection();
		try
		{
			String sqlQuery = "call spc_select_diagnostico_paciente_por_id(?)";
			CallableStatement call = (CallableStatement) con.prepareCall(sqlQuery);
			call.setInt(1,idPaciente);
			ResultSet rs = call.executeQuery();
			
			while(rs.next())
			{								
				arrCid.add(rs.getString("id_cid"));
			}
			
			call.close();
			con.close();
		}
		catch(Exception ex)
		{
			ex.printStackTrace();
		}
		
		return arrCid;
	}
	
	private static CallableStatement setObjectCallableStatement(Paciente paciente, String mysqlCall, Connection con ) throws SQLException
	{				
		CallableStatement prep = (CallableStatement) con.prepareCall(mysqlCall);		
		prep.setString(1, paciente.getNome());
		prep.setString(2, paciente.getEndereco());
		prep.setString(3, paciente.getHistorico_clinico());
		prep.setDate(4,   paciente.getInicio_tratamento());
		prep.setString(5, paciente.getCpf());
		prep.setString(6, paciente.getTelefone());
		prep.setString(7, paciente.getCelular());
		prep.setString(8, paciente.getEmail());
		prep.setString(9, paciente.getSexo());
		prep.setString(10, paciente.getCep());
		prep.setString(11, paciente.getRg());
		prep.setDate(12, paciente.getDataNascimento());
		prep.setInt(13, paciente.getIdConvenio());
		
		if(paciente.getIdPaciente() > 0)
			prep.setInt(14, paciente.getIdPaciente());
		else
			prep.registerOutParameter(14, Type.INT); // out para retornar o id do paciente que foi inserido		
		
		return prep; 		
	}

	
	public static Paciente setInstance(ResultSet res) throws SQLException
	{
		Paciente paciente = new Paciente();		
		paciente.setIdPaciente(res.getInt("id_paciente"));		
		paciente.setNome(res.getString("nome"));
		paciente.setEndereco(res.getString("endereco"));
		paciente.setHistorico_clinico(res.getString("historico_clinico"));
		paciente.setInicio_tratamento(res.getDate("inicio_tratamento"));
		paciente.setCpf(res.getString("cpf"));
		paciente.setTelefone(res.getString("telefone"));
		paciente.setCelular(res.getString("celular"));
		paciente.setEmail(res.getString("email"));
		paciente.setSexo(res.getString("sexo"));
		paciente.setCep(res.getString("cep"));
		paciente.setRg(res.getString("rg"));
		paciente.setDataNascimento(res.getDate("data_nascimento"));
		paciente.setIdConvenio(res.getInt("id_convenio"));		
		return paciente;		
	}	
}
